从 DAO Recordset 的记录中提取数据 您所在的位置:网站首页 vba 遍历数组 从 DAO Recordset 的记录中提取数据

从 DAO Recordset 的记录中提取数据

2024-07-14 15:28| 来源: 网络整理| 查看: 265

从 DAO Recordset 的记录中提取数据 项目04/07/2023

找到特定记录之后,您可能希望提取数据,以便在不修改基础源表的情况下在应用程序中使用。

复制单个字段

可以将单个字段的记录复制到适当数据类型的变量。 下面的示例从 Recordset 对象的第一条记录中提取三个字段。

Dim dbsNorthwind As DAO.Database Dim rstEmployees As DAO.Recordset Dim strFirstName As String Dim strLastName As String Dim strTitle As String Set dbsNorthwind = CurrentDb Set rstEmployees = dbsNorthwind.OpenRecordset("Employees") rstEmployees.MoveFirst strFirstName = rstEmployees!FirstName strLastName = rstEmployees!LastName strTitle = rstEmployees!Title 将整个记录复制到数组

若要复制一条或多条记录,您可以创建一个二维数组,并一次复制一条记录。 您将为每个字段增加第一个下标,并为每个字段增加第二个下标。

快速执行此操作的方法是使用 GetRows 方法,该方法将返回一个二维数组。 第一个下标标识字段,第二个下标标识行号,如下所示。

varRecords(intField, intRecord)

下面的代码示例使用 SQL 语句从名为“Employees”的表中检索三个字段,放入 Recordset 对象中。 然后,它使用 GetRows 方法检索 Recordset 的前三条记录,并将所选的记录存储在一个二维数组中。 然后,它通过使用两个数组索引来选择特定字段和记录,从而输出每条记录(一次一个字段)。

为了显示数组索引的使用方式,以下示例使用一个单独的语句来标识和输出每条记录的每个字段。 在实践中,更加可靠的做法是:使用两个相互嵌套的循环,并为逐步执行数组的两个维度的索引提供整数变量。

Sub GetRowsTest() Dim dbsNorthwind As DAO.Database Dim rstEmployees As DAO.Recordset Dim varRecords As Variant Dim intNumReturned As Integer Dim intNumColumns As Integer Dim intColumn As Integer Dim intRow As Integer Dim strSQL As String On Error GoTo ErrorHandler Set dbsNorthwind = CurrentDb strSQL = "SELECT FirstName, LastName, Title FROM Employees" Set rstEmployees = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) varRecords = rstEmployees.GetRows(3) intNumReturned = UBound(varRecords, 2) + 1 intNumColumns = UBound(varRecords, 1) + 1 For intRow = 0 To intNumReturned - 1 For intColumn = 0 To intNumColumns - 1 Debug.Print varRecords(intColumn, intRow) Next intColumn Next intRow rstEmployees.Close dbsNorthwind.Close Set rstEmployees = Nothing Set dbsNorthwind = Nothing Exit Sub ErrorHandler: MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description End Sub

如果有更多记录可用,请使用 对 GetRows 方法的 后续调用。 由于一旦调用 GetRows 方法,数组就会填满,因此您可以看到该方法为什么比一次复制一个字段要快得多。

另请注意,你不必将 Variant 声明为数组,因为当 GetRows 方法返回记录时,这会自动完成。 这样,您就可以在不知道将返回多少记录或字段的情况下使用固定长度数组维度,而不是使用占用更多内存的可变长度维度。

如果尝试使用多个 GetRows 调用检索所有行,请使用 EOF 属性,以确保位于 Recordset 的末尾。 GetRows 方法返回的行数可能比您请求的行数少。 举例来说,如果请求的行数超过 Recordset 中的剩余行数,则 GetRows 方法将只返回剩余的行。 同样,如果它无法检索所请求范围中的某行,则不会返回该行。

举例来说,如果无法检索您尝试检索的一组 10 条记录中的第五条记录,则 GetRows 方法将返回四条记录,并将当前记录位置保留在导致问题的记录上,且不会生成运行时错误。 如果另一个用户删除了动态集中的某个记录,则可能出现这种情况。 如果它返回的记录数比请求的数量少,并且您不在文件末尾,则需要阅读当前记录中的每个字段来确定 GetRows 方法遇到了什么错误。

由于 GetRows 方法始终返回 Recordset 对象中的所有字段,因此您可能想要创建一个仅返回所需字段的查询。 这对于“OLE 对象”和“备注”字段尤其重要。

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有